package com.tianya.common.util;
import java.util.Date;
import java.util.GregorianCalendar;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;
import org.apache.commons.lang.time.DateUtils;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.ServletContext;
public class Utility {
	/**
	 * 时间转换成Number
	 * @param dateStr 时间 yyy/MM/dd格式
	 * @return 转换后数字
	 */
	public static Integer convertDateNumber(String dateStr) {
		return convertDateNumber(dateStr,"/");
	}
	/**
	 * 时间转换成Number
	 * @param dateStr 时间字符串
	 * @param split 分隔符
	 * @return 转换后数字
	 */
	public static Integer convertDateNumber(String dateStr,String split) {
		String[] dateNum = dateStr.split(split);
		StringBuffer dateBuf = new StringBuffer();
		for (int i = 0; i < dateNum.length; i++) {
			dateBuf.append(padLeft(dateNum[i],"0",2));
		}
		return Integer.valueOf(dateBuf.toString());
	}
	/**
	 * 数字转化成日期字符串
	 * @param dateNum 日期8位数字
	 * @return 日期字符串yyyy/MM/dd
	 */
	public static String convertDateNumber(int dateNum) {
		String dateStr = String.valueOf(dateNum);
		StringBuffer dateBuf = new StringBuffer();
		if (dateStr.length() == 8) {
			dateBuf.append(dateStr.substring(0, 4));
			dateBuf.append("/");
			dateBuf.append(dateStr.substring(4, 6));
			dateBuf.append("/");
			dateBuf.append(dateStr.substring(6));
			dateStr = dateBuf.toString();
		}
		return dateStr;
	}
	/**
	 * 日期字符串转换成8位数字
	 * @param date 日期字符串
	 * @return 8位数字
	 */
	public static String FormatDate(int date)
	{
		try
		{
		Date datetag = DateUtils.parseDate(String.valueOf(date), new String[] { "yyyyMMdd" });
		SimpleDateFormat formater = new SimpleDateFormat("yyyy/MM/dd");   
		return formater.format(datetag);
		}
		catch(Exception e)
		{
			return String.valueOf(date);
		}
	}
	/**
	 * Date转化成字符串
	 * @param date 日期
	 * @return 字符串
	 */
	public static String dateToString(Date date)
	{
		return dateToString(date,"yyyyMMdd");
	}
	/**
	 * Date转化成字符串
	 * @param date 日期
	 * @param format 转化格式
	 * @return 字符串
	 */
	public static String dateToString(Date date,String format)
	{
		if(date == null){
			return "";
		}
		return new java.text.SimpleDateFormat(format).format(date);
	}
	/**
	 * 字符串转换成DATE
	 * @param dateStr 日期字符串
	 * @param format 日期字符串格式
	 * @return 日期
	 */
	public static Date stringToDate(String dateStr, String format)
	{
		try {
			return new java.text.SimpleDateFormat(format).parse(dateStr);
		} catch (Exception e) {
		}
		return null;
	}
	/**
	 * 转化成金额形式
	 * @param obj 金额数字
	 * @return 两位小数的金额形式
	 */
	public static String convertToAmount(Object obj)
	{
		return new java.text.DecimalFormat("#.00").format(obj);
	}
	/**
	 * 检查是否是合法的时间格式
	 * @param time 要检查的字符串
	 * @return 是为为合法格式
	 */
	public static boolean isTime(String time)
	{
		try
		{
			time = padLeft(time,"0",4);
			int hour = getInteger(time.substring(0,2));
			int minute = getInteger(time.substring(2));
			if(hour < 0 || hour > 23 || minute < 0 || minute > 59)
			{
				return false;
			}
			return true;
		}
		catch(Exception e)
		{
			return false;
		}
	}
	/**
	 * 检查邮件格式是否正确
	 * @param mailAddress 邮件地址
	 * @return true：正确 false：错误
	 */
	public static boolean isMail(String mailAddress)
	{
		//return  Pattern.matches("^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$",mailAddress);
		return Pattern.matches("^[0-9A-Za-z._-]+@[0-9A-Za-z_-]+[.]{1}[A-Za-z_-]+[A-Za-z_0-9.]*$", mailAddress);
	}
	/**
	 * 整型转化成指定格式的字符串
	 * @param src 整数
	 * @param format 格式字符串
	 * @return 格式化后字符串
	 */
	public static String integerToString(int src,String format)
	{
		DecimalFormat df = new DecimalFormat(format);
		return df.format(src);
	}
	/**
	 * 获取长整数值
	 * @param src 字符串
	 * @return 长整型
	 */
	public static Long getLong(String src)
	{
		if(src == null)
		{
			src = "0";
		}
		return Long.valueOf(src).longValue();
	}
	
	/**
	 * 获取整数值
	 * @param src 字符串
	 * @return 整型
	 */
	public static Integer getInteger(String src)
	{
		if(src == null || src.equals(""))
		{
			return 0;
		}
		return Integer.valueOf(src).intValue();
	}
	/**
	 * 左边填充
	 * @param src 被填充的字符串
	 * @param padchar 填充字符
	 * @param length 填充后长度
	 * @return 填充后字符串
	 */
	public static String padLeft(String src,String padchar,int length)
	{
		for(int i=src.length();i < length;i++)
		{
			src = padchar+ src;
		}
		
		return src;
	}
	/**
	 * 根据Bean的名称，获取Bean的实例
	 * @param beanName Bean名称
	 * @return bean的实例
	 */
	public static Object getBean(String beanName)
	{
		ServletContext context = ServletActionContext.getServletContext();
		ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
		return ctx.getBean(beanName);   
	}
	/**
	 * 日期相加
	 * @param date 日期
	 * @param days 加的天数
	 * @return 相加后日期
	 */
	public static Date dateAddDay(Date date,int days)
	{
		if(date==null) return null; 
		GregorianCalendar calendar = new GregorianCalendar(); 
		calendar.setTime(date); 
		calendar.add(GregorianCalendar.DATE, days); 
		date = calendar.getTime(); 
		return date; 
	} 
	/**
	 * 检查是否为整数
	 * @param src 字符串
	 * @return true： 是  false：不是
	 */
	public static Boolean isInteger(String src) {
		if(src == null || src.equals("")) {
			return false;
		}
		return  Pattern.matches("^[0-2]?[0-9]{1,9}$",src) && Long.parseLong(src)<Long.valueOf("2147483648");
	}
	/**
	 * 检查是否为数字
	 * @param src 字符串
	 * @return true：是 false：不是
	 */
	public static boolean isNumber(String src) {
		if(src == null || src.equals("")) {
			return false;
		}
		return Pattern.matches("^[0]{1}[.]{1}[0-9]+|[1-9]{1}[0-9]*[.]{1}[0-9]+|[1-9]{1}[0-9]*$", src);
	}
	/**
	 * 检查是否为合法日期
	 * @param src 日期字符串
	 * @return true：是 false：不是
	 */
	public static Boolean isDate(String src)
	{
		if (src == null) {
			return false;
		}
		try {
			
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
			dateFormat.setLenient(false);
			dateFormat.parse(src);
			return true;
		}
		catch (Exception e) {
			return false;
		}
	}
	/**
	 * 检查日期格式是否合法
	 * @param src
	 * @return
	 */
	public static Boolean isDates(String src){
		if(isEmpty(src)){
			return true;
		}
		if(src.contains("yyyy")&&src.contains("MM")&&src.contains("dd")){
			return true;
		}
		return false;
	}
	public static Boolean isfullDate(String src){
		if(isEmpty(src)){
			return true;
		}
		if(src.contains("yyyy")&&src.contains("MM")&&src.contains("dd")&&src.contains("HH")&&src.contains("mm")&&src.contains("ss")){
			return true;
		}
		return false;
	}
	public static Boolean isMdDate(String src) {
		if(isEmpty(src)){
			return true;
		}
		return src.contains("MM")&&src.contains("dd");
	}
	
	/**
	 * 检查时间格式是否合法
	 * @param date
	 * @return
	 * @throws ParseException
	 */
	public static Boolean isTimes(String src){
		if(isEmpty(src)){
			return true;
		}
		if(src.contains("HH")&&src.contains("mm")){
			return true;
		}
		return false;
	}
	public static Boolean isfullTime(String src){
		if(isEmpty(src)){
			return true;
		}
		if(src.contains("HH")&&src.contains("mm")&&src.contains("ss")){
			return true;
		}
		return false;
	}
	/**
	　* @param date,待转换的日期字符串
	　* @return
	　* @throws ParseException
	　*/
	public static Date parseStringToDate(String date) {
		try
		{
		Date result=null;
		String parse=date;
		parse=parse.replaceFirst("^[0-9]{4}([^0-9]?)", "yyyy$1");
		parse=parse.replaceFirst("^[0-9]{2}([^0-9]?)", "yy$1");
		parse=parse.replaceFirst("([^0-9]?)[0-9]{1,2}([^0-9]?)", "$1MM$2");
		parse=parse.replaceFirst("([^0-9]?)[0-9]{1,2}( ?)", "$1dd$2");
		parse=parse.replaceFirst("( )[0-9]{1,2}([^0-9]?)", "$1HH$2");
		parse=parse.replaceFirst("([^0-9]?)[0-9]{1,2}([^0-9]?)", "$1mm$2");
		parse=parse.replaceFirst("([^0-9]?)[0-9]{1,2}([^0-9]?)", "$1ss$2");
		DateFormat format=new SimpleDateFormat(parse);
		result=format.parse(date);
		return result;
		}
		catch(Exception e)
		{
			return null;
		}
	}
	/**
	 * 
	 * @param date1
	 * @param date2
	 * @param dateNum
	 * @return
	 */
	public static boolean checkDate(Date date1, Date date2, int dateNum)
	{
		return date1.after(Utility.dateAddDay(date2, dateNum));
	}
	/**
	 * 检查字符串是否为空或者null
	 * @param src 字符串
	 * @return 检查结果
	 */
	public static boolean isEmpty(Object src)
	{
		
		if(src == null)
		{
			return true;
		}
		if("".equals(src))
		{
			return true; 
		}
		String temp = src.toString().trim();
		if(temp.equals("")) return true;
		return false;  
	}
	/**
	 * 格式化数字
	 * @param object 需要格式化的字符串或者数字
	 * @param format 格式
	 * @return 格式化结果
	 */
	public static String formatNumber(Object object,String format)
	{
		String src ="0";
		if(object != null)
		{
			src = object.toString();
		}
		 
		DecimalFormat df = new DecimalFormat(src);
		return df.format(object);
	}
	
//	public static String getDateFormat(boolean isSys){
//		
//		//如果issys的值等于真就返回系统的日期，否则返回用户的日期；
//		if(isSys){
//			return SysInfo.getDateFormat();
//		}else{
//			UserInfo userInfo= getUserInfo();
//		    if(userInfo.getApply()==1){
//		    	if(userInfo.getDateFormat()==null||"".equals(userInfo.getDateFormat())){
//		    		return SysInfo.getDateFormat();
//		    	}
//			 return userInfo.getDateFormat();
//		   }
//		   return SysInfo.getDateFormat();
//		}
//		
//	}

	
	
	/**
	 * 返回字符串的byte长度
	 * @param str
	 * @return
	 */
	public static int getStrByte(String str){
		
		if(str==null||"".equals(str.trim())) return 0;
		
		try {
			return str.getBytes("gbk").length;
		} catch (UnsupportedEncodingException e) {
			
			e.printStackTrace();
		}
		return 0;
	}
	
	public static String formatString(String src,Object param){
		return formatString(src,new Object[]{param});
	}
	public static String formatString(String src,Object[] param){
		for(int i=0;i< param.length;i++){
			String str = "\\{"+i+"\\}";
			src = src.replaceAll(str,param[i]==null?"": param[i].toString());
		}
		return src;
	}


	/**
	 * 字节数组转十六进制字符串
	 * @param pArray 原字节数组	
	 * @return 十六进制字符串
	 */
	public static String Bin2HexString(byte[] pArray) 
	{		
		try 
		{
			java.lang.StringBuilder sb = new java.lang.StringBuilder();

			for (int i = 0; i < pArray.length; ++i) 
			{
				sb.append(Integer.toHexString((pArray[i] & 0xFF) | 0x100)
						.toLowerCase().substring(1, 3));
			}

			return sb.toString();
		}
		catch (Exception e) 
		{		
			return "";
		}
	}
	public static String convertToString(Object src){
		if(isEmpty(src)){
			return "";
		}
		return src.toString();
	}
	
	/**
	 * 判断4位日期是否合法(MMdd)
	 * @param date
	 * @return
	 */
	public static boolean isCurrentDate(Integer date) {
		if(date<101 || date>1231) return false;
		int month = date/100;
		int day = date%100;
		if(month==1 || month==3 ||month==5 || month==7 || month==8 ||month==10 ||month==12){
			return day<=31 && day>0;
		}else if(month==2) {
			return day<=29 && day>0;
		}else if(month==4 ||month==6 || month==9 ||month==11) {
			return day<=30 && day>0;
		}
		return false;
	}
	/**
	 * 判断4位日期时间的先后
	 * @param sdate	开始日期
	 * @param edate	结束日期
	 * @return	sdate在前返回true
	 */
	public static boolean compareDate(Integer sdate,Integer edate) {
		int smonth = sdate/100;
		int sday = sdate%100;
		int emonth = edate/100;
		int eday = edate%100;
		if(smonth==emonth) {
			return sday<eday;
		}else {
			return smonth<emonth;
		}
	}
	
	public static String nvl(Object src){
		if(src == null){
			return "";
		}
		return src.toString();
	}
}
